# 读入图像
import os
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

img_path = 'image.jpg'
img = Image.open(img_path)
img_array = np.array(img)

# 计算每个灰度级的频数和频率
gray_level = 256
freq = np.zeros(gray_level)
for i in range(img_array.shape[0]):
    for j in range(img_array.shape[1]):
        freq[img_array[i][j]] += 1
freq_prob = freq / img_array.size   # 频率=频数/总像素数

# 定义计算自信息的函数
def self_info(freq_prob):
    self_info = np.zeros(gray_level)
    for i in range(gray_level):
        if freq_prob[i] != 0:
            self_info[i] = -np.log2(freq_prob[i])   # 自信息=-log2(频率)
        else:
            self_info[i] = 0
    return self_info

self_info = self_info(freq_prob)

# 定义计算信息熵的函数
def cal_entropy(freq_prob):
    entropy = 0
    for i in range(gray_level):
        if freq_prob[i] != 0:
            entropy -= freq_prob[i] * np.log2(freq_prob[i])
    return entropy

entropy = cal_entropy(freq_prob)
print('信息熵:', entropy)

# 可视化
plt.subplot(221)   # 摆放原图
plt.imshow(img)

plt.subplot(222)   # 摆放频数图
plt.bar(range(gray_level), freq)

plt.subplot(223)   # 摆放自信息图
plt.bar(range(gray_level), self_info)

plt.text(150, 8, '信息熵:%.3f' %entropy) # 在图中添加信息熵信息

plt.show()  # 展示图像
